package com.xdw.vuebackdemo.util;

import java.io.UnsupportedEncodingException;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;



import javax.crypto.BadPaddingException;

import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.KeyGenerator;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;


/**
 * @author xiadewang
 */
public class AESUtil {

    /**

     * AES加密字符串

     *

     * @param content

     *            需要被加密的字符串

     * @param password

     *            加密需要的密码

     * @return 密文

     */

    public static byte[] encrypt(String content, String password) {

        try {

            KeyGenerator kgen = KeyGenerator.getInstance("AES");// 创建AES的Key生产者

            kgen.init(128, new SecureRandom(password.getBytes()));// 利用用户密码作为随机数初始化出

            //加密没关系，SecureRandom是生成安全随机数序列，password.getBytes()是种子，只要种子相同，序列就一样，所以解密只要有password就行

            SecretKey secretKey = kgen.generateKey();// 根据用户密码，生成一个密钥

            byte[] enCodeFormat = secretKey.getEncoded();// 返回基本编码格式的密钥，如果此密钥不支持编码，则返回

            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 转换为AES专用密钥

            Cipher cipher = Cipher.getInstance("AES");// 创建密码器

            byte[] byteContent = content.getBytes("utf-8");

            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化为加密模式的密码器

            byte[] result = cipher.doFinal(byteContent);// 加密

            return result;

        } catch (NoSuchPaddingException e) {

            e.printStackTrace();

        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        } catch (InvalidKeyException e) {

            e.printStackTrace();

        } catch (IllegalBlockSizeException e) {

            e.printStackTrace();

        } catch (BadPaddingException e) {

            e.printStackTrace();

        }

        return null;

    }



    /**

     * 解密AES加密过的字符串

     *

     * @param content

     *            AES加密过过的内容

     * @param password

     *            加密时的密码

     * @return 明文

     */

    public static byte[] decrypt(byte[] content, String password) {

        try {

            KeyGenerator kgen = KeyGenerator.getInstance("AES");// 创建AES的Key生产者

            kgen.init(128, new SecureRandom(password.getBytes()));

            SecretKey secretKey = kgen.generateKey();// 根据用户密码，生成一个密钥

            byte[] enCodeFormat = secretKey.getEncoded();// 返回基本编码格式的密钥

            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 转换为AES专用密钥

            Cipher cipher = Cipher.getInstance("AES");// 创建密码器

            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化为解密模式的密码器

            byte[] result = cipher.doFinal(content);

            return result; // 明文

        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        } catch (NoSuchPaddingException e) {

            e.printStackTrace();

        } catch (InvalidKeyException e) {

            e.printStackTrace();

        } catch (IllegalBlockSizeException e) {

            e.printStackTrace();

        } catch (BadPaddingException e) {

            e.printStackTrace();

        }

        return null;

    }

    public static void main(String[] args) throws Exception {

//        String content = "密码1993";
//
//        String password = "加密密码";
//
//        System.out.println("需要加密的内容：" + content);
//        long time = System.currentTimeMillis();
//        byte[] encrypt = encrypt(content, password);
//
//        System.out.println("加密后的2进制密文：" + new String(encrypt));
//
//        String hexStr = ParseSystemUtil.parseByte2HexStr(encrypt);
//
//        System.out.println("加密后的16进制密文:" + hexStr);
//        System.out.println("加密时间：" + (System.currentTimeMillis()-time));
//        byte[] byte2 = ParseSystemUtil.parseHexStr2Byte(hexStr);
//
//        System.out.println("加密后的2进制密文：" + new String(byte2));
//
//        byte[] decrypt = decrypt(byte2, password);
//
//        System.out.println("解密后的内容：" + new String(decrypt,"utf-8"));
        String data = "123456";
        String key = "1234567890987654"; // 长度为16的密钥

        long s = System.currentTimeMillis();

        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
        cipher.doFinal(data.getBytes());

        long e = System.currentTimeMillis();

        System.out.print("time: " + (e - s) + " ms");

    }

}
